package ms.platform.util;

import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
 * 视频转码
 * @author stay
 *
 */
public class ConvertVideoUtil {
	private static String inputPath = "";

    private static String outputPath = "";

    private static String ffmpegPath = "";
    private static String fileName = "";
	public static void getPath(String inPath,String ouPath,String ffPath,String fName) { 
        // 先获取当前项目路径，在获得源文件、目标文件、转换器的路径
        try {
            inputPath = inPath;
            outputPath = ouPath;
            ffmpegPath = ffPath;
            fileName = fName;
            System.out.println(outputPath);
            System.out.println(ffmpegPath);
            if (!checkfile(inputPath)) {
                System.out.println(inputPath + " is not file");
                return;
            }
            if (process()) {
                System.out.println("ok");
            }
        }
        catch (Exception e) {
            System.out.println("getPath出错");
        }
    }
	
	 private static boolean checkfile(String path) {
	        File file = new File(path);
	        if (!file.isFile()) {
	            return false;
	        }
	        return true;
	    }
	 
	 public static boolean process() {
	        int type = checkContentType();
	        boolean status = false;
	            System.out.println("直接转成mp4格式");
	            status = processMp4(inputPath);// 直接转成mp4格式
	        return status;
	    }
	 
	 private static int checkContentType() {
	        String type = inputPath.substring(inputPath.lastIndexOf(".") + 1, inputPath.length())
	                .toLowerCase();
	        // ffmpeg能解析的格式：（asx，asf，mpg，wmv，3gp，mp4，mov，avi，flv等）
	        if (type.equals("avi")) {
	            return 0;
	        } else if (type.equals("mpg")) {
	            return 0;
	        } else if (type.equals("wmv")) {
	            return 0;
	        } else if (type.equals("3gp")) {
	            return 0;
	        } else if (type.equals("mov")) {
	            return 0;
	        } else if (type.equals("mp4")) {
	            return 0;
	        } else if (type.equals("asf")) {
	            return 0;
	        } else if (type.equals("asx")) {
	            return 0;
	        } else if (type.equals("flv")) {
	            return 0;
	        }
	        // 对ffmpeg无法解析的文件格式(wmv9，rm，rmvb等),
	        // 可以先用别的工具（mencoder）转换为avi(ffmpeg能解析的)格式.
	        else if (type.equals("wmv9")) {
	            return 1;
	        } else if (type.equals("rm")) {
	            return 1;
	        } else if (type.equals("rmvb")) {
	            return 1;
	        }
	        return 9;
	    }
	 
	 private static boolean processMp4(String oldfilepath) {

		    if (!checkfile(inputPath)) {
		        System.out.println(oldfilepath + " is not file");
		        return false;
		    }
		    List<String> command = new ArrayList<String>();
		    command.add(ffmpegPath);
		    command.add("-i");
		    command.add(oldfilepath);
		    command.add("-c:v");
		    command.add("libx264");
//		    command.add("-mbd");
//		    command.add("0");
		    command.add("-c:a");
		    command.add("aac");
		    command.add("-strict");
		    command.add("-2");
		    command.add("-pix_fmt");
		    command.add("yuv420p");
		    command.add("-movflags");
		    command.add("faststart");
		    command.add(outputPath + "new_"+fileName+".mp4");
		    try {

		        // 方案1
//		        Process videoProcess = Runtime.getRuntime().exec(ffmpegPath + " -i " + oldfilepath 
//		                + " -ab 56 -ar 22050 -qscale 8 -r 15 -s 600x500 "
//		                + outputPath + "new_"+fileName+".flv");

		        // 方案2
		        Process videoProcess = new ProcessBuilder(command).redirectErrorStream(true).start();

		        new PrintStream(videoProcess.getErrorStream()).start();

		        new PrintStream(videoProcess.getInputStream()).start();

		        videoProcess.waitFor();

		        return true;
		    } catch (Exception e) {
		        e.printStackTrace();
		        return false;
		    }
		}
}

class PrintStream extends Thread 
{
    java.io.InputStream __is = null;
    public PrintStream(java.io.InputStream is) 
    {
        __is = is;
    } 

    public void run() 
    {
        try 
        {
            while(this != null) 
            {
                int _ch = __is.read();
                if(_ch != -1) 
                    System.out.print((char)_ch); 
                else break;
            }
        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        } 
    }
}